#include "dattype_list.h"
#include "dattype_ctrl.h"

DatType_List::DatType_List(QWidget *parent) : QFrame(parent)
{
    setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
    setAcceptDrops(true);
    HLayout = new QHBoxLayout;
    setLayout(HLayout);
    IsEnterDrag = false;
    MyLab.hide();
}


/*  函数名称: mousePressEvent
 *  函数作用: 实现局内拖拽事件
 *
 */
void DatType_List::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        //***********************************************************************获取显示控件
        DatType_Ctrl *ChildItem = static_cast<DatType_Ctrl*>(childAt(event->pos()));
        if(ChildItem == 0)return;
        //**********************************************************获取信息
        QString Style = ChildItem->styleSheet();
        QString Text  = ChildItem->text();
        //**********************************************************生成图标
        QLabel Lab;
        Lab.setStyleSheet(Style);
        Lab.setText(Text);
        Lab.setFixedSize(141,30);
        QPixmap pixmap(Lab.size());
        Lab.render(&pixmap);
        //**********************************************************构建信息流
        QByteArray itemData;
        QDataStream dataStream(&itemData, QIODevice::WriteOnly);
        dataStream << Style << Text;

        QMimeData *mimeData = new QMimeData;
        mimeData->setData("DataType", itemData);
        //**********************************************************执行拖拽
        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);
        drag->setPixmap(pixmap);
        drag->setHotSpot(QPoint(Lab.rect().center().x(),Lab.rect().center().y() - 20));
        //**********************************************************移除选中控件
        HLayout->removeWidget(ChildItem);
        ChildItem->close();
        drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
    }

}



/*  函数名称: dragEnterEvent
 *  函数作用: 进入“DataType”拖拽事件
 *
 */
void DatType_List::dragEnterEvent(QDragEnterEvent *event)
{
    //**********************************************************接收处理，允许接收其他部件的拖放数据流
    if (event->mimeData()->hasFormat("DataType"))
    {
        if (event->source() == this)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else
        {
            event->acceptProposedAction();
        }
        IsEnterDrag = true;
    }
    else
    {
        event->ignore();
    }
}
/*  函数名称: dragMoveEvent
 *  函数作用: “DataType”拖拽移动事件
 *
 */
void DatType_List::dragMoveEvent(QDragMoveEvent *event)
{
    if (IsEnterDrag && event->mimeData()->hasFormat("DataType"))
    {
        QPoint pos = event->pos();
        if(HLayout->indexOf(&MyLab) == -1)
        {
            QByteArray itemData = event->mimeData()->data("DataType");
            QDataStream dataStream(&itemData, QIODevice::ReadOnly);
            QString Style;
            QString Text;
            dataStream >> Style >>Text;

            MyLab.setStyleSheet(Style);
            MyLab.setText("插入位置");
            HLayout->addWidget( &MyLab);
            MyLab.show();
        }
        else
        {
            InsertOffset = pos.x() / (this->width() /  HLayout->count());
            HLayout->removeWidget(&MyLab);
            HLayout->insertWidget(InsertOffset, &MyLab);
        }
    }
}

/*  函数名称: dropEvent
 *  函数作用: “DataType”拖拽完成事件
 *
 */
void DatType_List::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasFormat("DataType"))
    {
        //**********************************************************获取拖放动作传输来的mimeData解析数据
        QByteArray itemData = event->mimeData()->data("DataType");
        QDataStream dataStream(&itemData, QIODevice::ReadOnly);
        QString Style;
        QString Text;
        dataStream >> Style >>Text;
        //**********************************************************根据解析的数据创建新对象
        DatType_Ctrl *newItem = new DatType_Ctrl(this);
        newItem->setText(Text);
        newItem->setStyleSheet(Style);
        newItem->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        newItem->show();
        newItem->setAttribute(Qt::WA_DeleteOnClose);

        //**********************************************************判断要插入的位置 & 隐藏提示控件
        HLayout->insertWidget(InsertOffset, newItem);
        if(HLayout->indexOf(&MyLab) != -1)
        {
            HLayout->removeWidget(&MyLab);
            MyLab.hide();
        }
        //**********************************************************接收处理，允许接收其他部件的拖放数据流
        if (event->source() == this)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else
        {
            event->acceptProposedAction();
        }
        IsEnterDrag = false;
    }
    else
    {
        event->ignore();
    }

}
/*  函数名称: dragLeaveEvent
 *  函数作用: 离开“DataType”拖拽事件
 *
 */
void DatType_List::dragLeaveEvent(QDragLeaveEvent *event)
{
    if(IsEnterDrag)
    {
        IsEnterDrag = false;
        HLayout->removeWidget(&MyLab);
        MyLab.hide();
        qDebug() << "离开拖拽区";
    }
}

